# Лекция 3: JavaScript, как ассемблер нашего времени

- Основной репозиторий на Github: [HowProgrammingWorks](https://github.com/HowProgrammingWorks)
- Основы JavaScript, синтаксис, типы, операторы - все это лучше всего брать
на [MDN: Mozilla Developer Network](https://developer.mozilla.org/ru/docs/Web/JavaScript)
где они есть и на английском языке (предпочтительно) и в переводе на множество
других языков. Можно помогать сообществу дописывать статьи и учебник.
- Абстракции как сущность программирования и инженерии
- [Переменные и типы данных](https://github.com/HowProgrammingWorks/DataTypes),
скалярные и ссылочные типы, объекты, массивы и структуры данных
- [Функции](https://github.com/HowProgrammingWorks/Function) включая анонимные
и лямбда-выражения
- Домашнее задание:
  - Осваиваем синтаксис языка по MDN
  - Еще раз смотрим примеры, которые были на лекции
  - Попробуйте модифицировать простые примеры и написать что-то сложнее
  - Если Вы увидели что улучшить в примерах, то сделайте форк репозитория,
  склонируйте его через гит к себе, сделайте коммит, откройте пул-реквест
  и я рассмотрю и добавлю Ваши улучшения, если они улучшат код примеров.
  - В последнем файле [d-decompose.js](https://github.com/HowProgrammingWorks/Function/blob/master/JavaScript/d-decompose.js)
  есть много кода, который можно изучить и попробовать модифицировать.
    - Найдите функцию `badIntrospect` - это пример плохого кода, хоть стиль и
    соблюден, код написан ровно и максимально понятно, но функция огромная.
    Что она делает в общем, понять сложно. Она берет программный интерфейс (API)
    и перебирает в нем все методы, парсит (делает синтаксический разбор текста)
    и превращает заголовки функций в структуры данных для последующей генерации
    документации.
    - Чуть выше в файле есть тот же код, но декомпозированный (разделенный
    логически) на три функции: `parseLines`, `parseSignature`, `introspect`.
    Посмотрите их и сравните с `badIntrospect`.
    - Еще есть в файле 2 функции поменьше: `merge` и `section`, они еще лучше
    в плане простоты и понятности. Функция `section` используется как в простом,
    так и в сложном примере кода. Она разделяет строку на две, по подстроке,
    отдавая массив с двумя элементами: часть до подстроки и часть после.
    Функция `merge` объединяет несколько массивов в один.
    - Попробуйте декомпозировать (разделить) `badIntrospect` на несколько функций
    лучше, чем в примере или разделить три функции `parseLines`, `parseSignature`,
    `introspect` на более мелкие, или выделить из них какие-то обобщения
    (повторяющиеся места). Таким образом построив новые программные абстракции,
    которые могут повторно использоваться, независимо тестироваться, проще
    восприниматься и модифицироваться.
    - Попробуйте оптимизировать сам алгоритм парсинга, улучшить его, упростить,
    ускорить или сделать более понятным.
    - Попробуйте сгенерировать документацию из структур данных, полученных в
    результате работы этих функций в форматах md или html.

Конечно, сделать все это за сутки нельзя, но можно продолжить на выходных или
после завершения летней школы продолжить разбираться самостоятельно, ведь я даю
только основы, а программирование так устроено, что большую часть нужно постигать
самостоятельно и на практике. Я же нужен для обзора, задания общего направления,
ответов на вопросы и примеров кода. Жду Вас на лекции #4 сегодня.
